package hanlen.mq.starter.core;

import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RBlockingQueue;
import org.redisson.api.RMapCache;
import org.redisson.api.RTopic;
import org.redisson.client.codec.Codec;

/**
 * archives-service
 *
 * @author MrYe
 * @date 2021-01-11 16:37
 */
public interface RedissonService {

    /**
     * 添加到正常队列
     *
     * @param name 队列名
     * @param data 数据
     * @param <T>  数据类型
     */
    <T> void addQueue(String name, T data);

    /**
     * 添加到正常队列
     *
     * @param name   队列名
     * @param header 头信息
     * @param data   数据
     * @param <T>    数据类型
     */
    <T> void addQueue(String name, Map<String, String> header, T data);

    /**
     * 添加到延迟队列
     *
     * @param name     队列名称
     * @param header   头信息
     * @param body     数据
     * @param delay    延迟时间
     * @param timeUnit 延迟时间单位
     * @param <T>      数据类型
     */
    <T> void addDelayedQueue(String name, Map<String, String> header, T body, long delay, TimeUnit timeUnit);

    /**
     * 删除延迟队列
     *
     * @param name 队列名
     */
    <T> void deleteDelayedQueue(String name);

    /**
     * 获取阻塞队列
     *
     * @param name 队列名称
     * @param <T>  数据类型
     * @return RBlockingQueue
     */
    <T> RBlockingQueue<T> getBlockingQueue(String name);

    /**
     * 设置不过期缓存
     *
     * @param key 键
     * @param val 值
     * @return 成功标记
     */
    <V> boolean set(String key, V val);

    /**
     * 设置缓存
     *
     * @param key      键
     * @param val      值
     * @param expired  过期时间
     * @param timeUnit 过期时间单位
     * @return 成功标记
     */
    <V> boolean set(String key, V val, long expired, TimeUnit timeUnit);

    /**
     * 删除缓存
     *
     * @param key 键
     * @return 成功标记
     */
    boolean delete(String key);

    /**
     * 获取缓存
     *
     * @param key 键
     * @return 结果
     */
    <R> R get(String key);

    /**
     * 查询
     *
     * @param key        键
     * @param function   function
     * @param timeToLive 时间
     * @param timeUnit   时间单位
     * @param <R>        结果
     * @return 结果
     */
    <R> R get(String key, Function<String, R> function, long timeToLive, TimeUnit timeUnit);

    /**
     * 获取AtomicLong
     *
     * @param key 键
     * @return 计算后的值
     */
    RAtomicLong getAtomicLong(String key);

    /**
     * 获取RMap
     *
     * @param name map名称
     * @return RMapCache
     */
    RMapCache<String, Object> getMapCache(String name);

    /**
     * 发布事件
     *
     * @param topicName Topic名称
     * @param value     数据
     */
    void publish(String topicName, Object value);

    /**
     * 发布事件
     *
     * @param topicName Topic名称
     * @param value     数据
     * @param codec     序列化方式
     */
    void publish(String topicName, Object value, Codec codec);

    /**
     * 获取pub/sub topicName
     *
     * @param topicName 队列名
     * @param codec     编码方式
     * @return RTopic
     */
    RTopic getTopic(String topicName, Codec codec);

}
